package com.example.unruly_zhao.mopaide.global;

import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
import android.widget.ImageView;
import com.example.unruly_zhao.mopaide.R;
import com.example.unruly_zhao.mopaide.httpParams.Urls;
import com.example.unruly_zhao.mopaide.util.FileUtil;
import com.example.unruly_zhao.mopaide.util.LogUtil;
import com.example.unruly_zhao.mopaide.util.SharedPrefUtil;
import com.github.yoojia.qrcode.qrcode.QRCodeEncoder;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.callback.BitmapCallback;
import com.lzy.okgo.cookie.store.PersistentCookieStore;

import java.io.File;
import java.util.logging.Level;

import okhttp3.Call;
import okhttp3.Response;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

import static java.lang.Math.log;

/**
 * Created by xuchen on 2017/6/16 15:36
 */
public class GlobalApplication extends Application {
    public static Context context;
    public static Handler mainHandler;//全局的handler
    private ImageView mQRCodeImage;

    @Override
    public void onCreate() {
        super.onCreate();
        mainHandler = new Handler(Looper.getMainLooper());//初始化Handler
        context = this.getApplicationContext();

        initOkGo();  //初始化okgo

        // initImage();  //生成二维码

    }

    /**
     * 生成二维码
     */
    private void initImage() {

        String imageFilePath = Constants.FILE_PATH + Constants.FLAG_IMG + ".jpg";
        File file = new File(imageFilePath);
        if (!file.exists()) { // 判断file是否存在
            Log.e("imagePath1", imageFilePath + "");
            final WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
            final Display display = manager.getDefaultDisplay();
            Point displaySize = new Point();
            display.getSize(displaySize);
            final int size = Math.min(displaySize.x, displaySize.y);
            generateQRCode(size);
        }
    }

    /**
     * 下载图片
     */

    private void generateQRCode(final int size) {

        int deviceId = SharedPrefUtil.getInt(context, Constants.FLAG_IMG, 0);
        if (deviceId == 0) {
            LogUtil.e("tag", "设备id为0");
            return;
        }
        LogUtil.e("flag", "deviceId:" + deviceId);
        log( deviceId);

        Observable.just("http://pb.en8848.com/mqtt/PhpMQTTClient-master/mpadsend.php?device" + deviceId)
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String content) {
                        final Bitmap centerImage = BitmapFactory.decodeResource(getResources(), R.mipmap.icon);
                        return new QRCodeEncoder.Builder()
                                .width(size)
                                .height(size)
                                .paddingPx(0)
                                .marginPt(3)
                                .centerImage(centerImage)
                                .build()
                                .encode(content);
                    }
                })
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        mQRCodeImage.setImageBitmap(bitmap);
                    }
                });
    }


    /**
     * 下载
     *
     * @param deviceId
     */
    private void saveDeiceFlagImg(int deviceId) {

        OkGo.get(Urls.DOWN_IMG + deviceId)
                .execute(new BitmapCallback() {
                    @Override
                    public void onSuccess(Bitmap bitmap, Call call, Response response) {
                        FileUtil.saveBitmap(bitmap, Constants.FLAG_IMG);
                    }
                });
    }

    private void initOkGo() {


        OkGo.init(this);
        try {
            //以下都不是必须的，根据需要自行选择,一般来说只需要 debug,缓存相关,cookie相关的 就可以了
            OkGo.getInstance()

                    .debug("OkGo", Level.INFO, true)
                    //如果使用默认的 60秒,以下三行也不需要传
                    .setConnectTimeout(OkGo.DEFAULT_MILLISECONDS)  //全局的连接超时时间
                    .setReadTimeOut(OkGo.DEFAULT_MILLISECONDS)     //全局的读取超时时间
                    .setWriteTimeOut(OkGo.DEFAULT_MILLISECONDS)    //全局的写入超时时间

                    //可以全局统一设置缓存模式,默认是不使用缓存,可以不传,具体其他模式看 github 介绍 https://github.com/jeasonlzy/
                    .setCacheMode(CacheMode.NO_CACHE)

                    //可以全局统一设置缓存时间,默认永不过期,具体使用方法看 github 介绍
                    .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)

                    //可以全局统一设置超时重连次数,默认为三次,那么最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0
                    .setRetryCount(3)

                    .setCookieStore(new PersistentCookieStore())        //cookie持久化存储，如果cookie不过期，则一直有效
                    //     .addCommonParams(new CommonParams())
                    .setCertificates();                                 //方法一：信任所有证书,不安全有风险
//              .setCertificates(new SafeTrustManager())            //方法二：自定义信任规则，校验服务端证书
//              .setCertificates(getAssets().open("srca.cer"))      //方法三：使用预埋证书，校验服务端证书（自签名证书）
//              //方法四：使用bks证书和密码管理客户端证书（双向认证），使用预埋证书，校验服务端证书（自签名证书）
//               .setCertificates(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"))//

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
